package com.yuma.pool;

import java.security.cert.CertificateFactory;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 自定义线程池，ThreadPoolExecutor创建自定义

        /**
         * 7个参数： 核心数、最大数、存活时间、存活时间单位、阻塞队列、线程工厂、拒绝策略
         * 1. corePoolSize:    核心线程的数量
         * 2. maximumPoolSize: 最大线程的数量
         * 3. keepAliveTime:   线程没有任务时，存活的时间
         * 4. unit:            存活的时间单位
         * 5. workQueue:       阻塞队列，当线程数达到核心后，新任务会进入阻塞队列，等待被执行 BlockingQueue
         * 6. threadFactory:   线程工厂，创建线程
         * 7. handler:         拒绝策略，当阻塞队列已满，且线程数达到最大线程数时，执行拒绝策略
         */
        ThreadPoolExecutor pool = new ThreadPoolExecutor(3,   // 1.先来的三个有饭吃
                5,    // 3.阻塞队列满了以后，开辟到最大线程数
                60,TimeUnit.SECONDS,   // 增长出来的那max-core=2的线程60秒没活干就被干掉
                new ArrayBlockingQueue<>(3),   // 2.后来的先把阻塞队列里填满
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());  // 4.最大线程都满了此时其他运行的线程还没释放，则被拒绝

        for(int i = 0 ; i < 10; i ++){
            pool.execute(()->{
                System.out.println(Thread.currentThread().getName() + " 正在执行");
            });
        }

        pool.shutdown();
    }
}
